﻿using System;
using System.Windows;
using System.Net.Sockets;
using System.IO;
using System.Net;
using System.Web.Script.Serialization;
using System.Text;


namespace JogoUno
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        public static string separador = "#";

        public static TcpClient socket;
        public static TcpClient socketRetorno;
        public static NetworkStream networkStream;
        public static StreamReader reader;
        public static StreamWriter writer;
        public static StreamReader readerRetorno;

        private static Window menu;
        private static Window criarSala;
        private static Window sala;
        private static Window main;
        private static Window partida;


        public static Jogador jogador;
        public static string servidor;
        public static string nomeJogador;
        public static string nomeSala;
        public static Boolean lider;


        public static string enviarMensagem(string recurso, string parametros)
        {

            string uri = recurso;
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
            webRequest.Method = "GET";

            try
            {
                HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
                if (webResponse.StatusCode == HttpStatusCode.OK)
                {
                    var stream = webResponse.GetResponseStream();
                    string resposta = (new StreamReader(stream)).ReadToEnd();

                    try
                    {
                        JavaScriptSerializer json = new JavaScriptSerializer();
                        var data = json.Deserialize<dynamic>(resposta);
                        MessageBox.Show(data["erro"]);
                        return null;
                    }
                    catch (Exception ex)
                    {
                    }
                    return resposta;
                }
                else
                {
                    MessageBox.Show("Problemas no servidor.");
                }
            }
            catch (Exception ex) {
                MessageBox.Show("Servidor não foi encontrado.");
            }
            return null;
        }

        public MainWindow()
        {
            InitializeComponent();
            main = this;
        }

        //botao logar
        private void button1_Click(object sender, RoutedEventArgs e)
        {
/*
            try
            {
               socket = new TcpClient();

                socket.Connect(txbox_servidor.Text, 6654);
                networkStream = socket.GetStream();
                
                reader = new StreamReader(networkStream, Encoding.ASCII);
                writer = new StreamWriter(networkStream, Encoding.ASCII);
                writer.AutoFlush = true;

                socketRetorno = new TcpClient();

                socketRetorno.Connect(txbox_servidor.Text, 6654);
                NetworkStream  streamRetorno = socketRetorno.GetStream();

                readerRetorno = new StreamReader(streamRetorno, Encoding.ASCII);


                writer.WriteLine("autenticar" + separador + tbox_usuario.Text + separador + tbox_senha.Text); //envia msg ao servidor
                string [] resposta = reader.ReadLine().Split('|');
*/


                //enviarMensagem("http://" + servidor + ":9000/uno/notificador", "");
                servidor = txbox_servidor.Text;
                string resposta = enviarMensagem("http://"+ servidor +":9000/uno/autenticacao/"+ tbox_usuario.Text +"/"+ tbox_senha.Password, "");
                if (resposta != null)
                {

                    JavaScriptSerializer json = new JavaScriptSerializer();
                    jogador = json.Deserialize<Jogador>(resposta);

                    MainWindow.nomeJogador = tbox_usuario.Text;



                    //faz conexao com o notificador
                    socket = new TcpClient();
                    socket.Connect(txbox_servidor.Text, 6654);
                    networkStream = socket.GetStream();

                    reader = new StreamReader(networkStream, Encoding.ASCII);
                    writer = new StreamWriter(networkStream, Encoding.ASCII);
                    writer.AutoFlush = true;

                    //se identifica, informando qual jogador ele representa
                    writer.WriteLine(jogador.idJogador);
                    //writer.Flush();



                    Menu menu = (Menu)MainWindow.exibirJanela(MainWindow.JANELA_MENU);
                    this.Hide();
                    menu.Show();
                }

 
                
/*                if (resposta[0] == "OK")
                {
                    MainWindow.nomeJogador = tbox_usuario.Text;

                    Menu menu = (Menu) MainWindow.exibirJanela(MainWindow.JANELA_MENU);
                    this.Hide();
                    menu.Show();
                }
                else {
                    MessageBox.Show(this, resposta[1]);
                }
*/


/*                
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro: " + ex.Message);
            }
 */       }

        private void button2_Click(object sender, RoutedEventArgs e)
        {
            Close();
        }


        public static int JANELA_MENU = 0;
        public static int JANELA_CRIAR_SALA = 1;
        public static int JANELA_SALA = 2;
        public static int JANELA_MAIN = 3;
        public static int JANELA_PARTIDA = 4;

        public static Window exibirJanela(int janela) {

            Window janelaO;

            if (janela == JANELA_MENU) {
                janelaO = menu;
                if (janelaO == null)
                {
                    janelaO = new Menu();
                }
            } else if (janela == JANELA_CRIAR_SALA) {
                janelaO = criarSala;
                if (janelaO == null)
                {
                    janelaO = new CriarSala();
                }
            }
            else if (janela == JANELA_SALA)
            {
                janelaO = sala;
                if (janelaO == null)
                {
                    janelaO = new Sala();
                }
            }
            else if (janela == JANELA_PARTIDA)
            {
                janelaO = partida;
                if (janelaO == null)
                {
                    janelaO = new Partida();
                }
            }
            else 
            {
                janelaO = main;
                if (janelaO == null)
                {
                    janelaO = new MainWindow();
                }
            }

            return janelaO;
        }


        public static void fechar(int janela)
        {
            Window janelaO;

            if (janela == JANELA_MENU)
            {
                janelaO = menu;
                menu = null;
            }
            else if (janela == JANELA_CRIAR_SALA)
            {
                janelaO = criarSala;
                criarSala =  null;  
            }
            else if (janela == JANELA_SALA)
            {
                janelaO = sala;
                sala = null;   
            }
            else if (janela == JANELA_PARTIDA)
            {
                janelaO = partida;
                partida = null;             
            }
            else
            {
                janelaO = main;
                main = null;          
            }
        }

        public static void encerrar() {
            /*if (writer != null)
            {
                writer.WriteLine("LOGOUT"); //envia msg ao servidor
            }*/
            
            
            try {
                menu.Close();
            } catch {}

            try
            {
                criarSala.Close();
            }
            catch { }

            try
            {
                sala.Close();
            }
            catch { }

            try {
                main.Close();
            }
            catch { }

        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            if (jogador != null)
            {
                string resposta = MainWindow.enviarMensagem("http://" + MainWindow.servidor + ":9000/uno/logout/" + MainWindow.jogador.idJogador, "");
            }
        }


        public static void threadSocketReader() {

            try
            {
                while (true)
                {

                    string [] token = reader.ReadLine().Split('|');
                    if (token[0] == "OK") {

                    } else if (token[0] == "ERROR") {

                    }
                    else if (token[0] == "ATUALIZAR")
                    {
                    }
                }
            }
            catch { }

        }

        private void button3_Click(object sender, RoutedEventArgs e)
        {
            //faz conexao com o notificador
            TcpClient socket2 = new TcpClient();
            socket2.Connect(txbox_servidor.Text, 6654);
            networkStream = socket2.GetStream();

            reader = new StreamReader(networkStream, Encoding.ASCII);
            writer = new StreamWriter(networkStream, Encoding.ASCII);
            writer.AutoFlush = true;

            //se identifica, informando qual jogador ele representa
            writer.WriteLine(jogador.idJogador);
            writer.Flush();

            //string resposta = reader.ReadLine();
        }

    }
}
